/**
 * 鼠标交互控制器 - 使用OrbitControls插件处理场景的旋转和缩放
 * 依赖全局THREE对象和OrbitControls插件（通过CDN引入）
 */
class MouseInteractionController {
    /**
     * 构造函数
     * @param {THREE.Scene} scene - 要操作的场景
     * @param {THREE.Camera} camera - 要控制的相机
     * @param {THREE.WebGLRenderer} renderer - WebGL渲染器实例
     * @param {Object} options - 配置选项
     */
    constructor(scene, camera, renderer, options = {}) {
        if (!window.THREE) {
            console.error('THREE.js 未正确加载');
            return;
        }
        
        if (!window.THREE.OrbitControls) {
            console.error('OrbitControls 插件未正确加载');
            return;
        }
        
        this.scene = scene;
        this.camera = camera;
        this.renderer = renderer;
        
        // 初始化OrbitControls，使用renderer的canvas元素作为事件监听器的目标元素
        // 这样可以避免与页面上的UI控件（如下拉菜单）产生事件冲突
        this.controls = new THREE.OrbitControls(camera, renderer && renderer.domElement ? renderer.domElement : document.body);
        
        // 设置控制参数
        this.controls.enableDamping = true; // 启用阻尼效果，使旋转更平滑
        this.controls.dampingFactor = options.dampingFactor || 0.05; // 阻尼系数
        this.controls.rotateSpeed = options.rotateSpeed || 0.5; // 旋转速度，设置较低值使控制更精确
        this.controls.zoomSpeed = options.zoomSpeed || 0.5; // 缩放速度，设置较低值使控制更精确
        this.controls.panSpeed = options.panSpeed || 0.5; // 平移速度
        
        // 设置最小和最大距离
        this.controls.minDistance = options.minDistance || 200; // 相机最小距离
        this.controls.maxDistance = options.maxDistance || 2000; // 相机最大距离
        
        // 设置最小和最大极角，控制垂直方向的旋转范围
        this.controls.minPolarAngle = 0; // 最小极角（俯视角度限制）
        this.controls.maxPolarAngle = Math.PI / 2; // 最大极角（仰视角度限制），这里设为π/2，即90度
        
        // 设置目标点，相机将围绕这个点旋转
        this.controls.target.set(0, 0, 0); // 围绕原点旋转
        
        // 禁用平移控制，只保留旋转和缩放
        this.controls.enablePan = options.enablePan || false;
        
        // 更新控制器，应用初始设置
        this.controls.update();
    }
    
    /**
     * 更新控制器状态
     * 在动画循环中调用此方法以确保阻尼效果正常工作
     */
    update() {
        if (this.controls) {
            this.controls.update();
        }
    }
    
    /**
     * 销毁控制器，移除事件监听器和资源
     */
    dispose() {
        if (this.controls) {
            this.controls.dispose();
            this.controls = null;
        }
    }
    
    /**
     * 启用/禁用旋转控制
     * @param {boolean} enabled - 是否启用旋转
     */
    enableRotate(enabled) {
        if (this.controls) {
            this.controls.enableRotate = enabled;
        }
    }
    
    /**
     * 启用/禁用缩放控制
     * @param {boolean} enabled - 是否启用缩放
     */
    enableZoom(enabled) {
        if (this.controls) {
            this.controls.enableZoom = enabled;
        }
    }
    
    /**
     * 启用/禁用平移控制
     * @param {boolean} enabled - 是否启用平移
     */
    enablePan(enabled) {
        if (this.controls) {
            this.controls.enablePan = enabled;
        }
    }
    
    /**
     * 设置相机目标点
     * @param {number} x - X坐标
     * @param {number} y - Y坐标
     * @param {number} z - Z坐标
     */
    setTarget(x, y, z) {
        if (this.controls) {
            this.controls.target.set(x, y, z);
            this.controls.update();
        }
    }
    
    /**
     * 获取当前控制器
     * @returns {THREE.OrbitControls} - OrbitControls实例
     */
    getControls() {
        return this.controls;
    }
}

/**
 * 创建鼠标交互控制器的工厂函数
 * @param {THREE.Scene} scene - 要操作的场景
 * @param {THREE.Camera} camera - 要控制的相机
 * @param {THREE.WebGLRenderer} renderer - WebGL渲染器实例
 * @param {Object} options - 配置选项
 * @returns {MouseInteractionController} - 鼠标交互控制器实例
 */
export function createMouseInteractionController(scene, camera, renderer, options = {}) {
    return new MouseInteractionController(scene, camera, renderer, options);
}